package com.skyhigh.web.webservice.controllers;

import java.io.File;
import java.util.Calendar;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.support.SessionStatus;

import com.skyhigh.web.webservice.domain.Carga;
import com.skyhigh.web.webservice.domain.Contenedor;
import com.skyhigh.web.webservice.domain.ContenidoFactura;
import com.skyhigh.web.webservice.domain.Documento;
import com.skyhigh.web.webservice.domain.Factura;
import com.skyhigh.web.webservice.services.ClienteService;
import com.skyhigh.web.webservice.services.ContenedorService;
import com.skyhigh.web.webservice.services.ContenidoFacturaService;
import com.skyhigh.web.webservice.services.DocumentoService;
import com.skyhigh.web.webservice.services.FacturaService;
import com.skyhigh.web.webservice.services.PaisService;
import com.skyhigh.web.webservice.services.PatioService;
import com.skyhigh.web.webservice.services.TipoMovimientoService;
import com.skyhigh.web.webservice.services.TransportistaService;

@Controller
public class ContenedoresController {
	
	@Autowired
	private ContenedorService service;
	@Autowired
	private PaisService paisService;
	@Autowired
	private TipoMovimientoService tipoMovimientoService;
	@Autowired
	private TransportistaService transportistaService;
	@Autowired
	private PatioService patioService;
	@Autowired
	private DocumentoService documentoService;
	@Autowired
	private ClienteService clienteService;
	@Autowired
	private FacturaService facturaService;
	@Autowired
	private ContenidoFacturaService contenidoFacturaService;

	
	private final double PRECIO_CONTENEDOR_PESO = 3.5;
	private final double TASA_IMPOSITIVA = 13;
	
	protected final Log logger = LogFactory.getLog(getClass());
	
	@RequestMapping(value="/buscarContenedores.htm", method = RequestMethod.GET)
	public String desplegarFormularioBusqueda(ModelMap model){	
				
		int totalObjetos = service.obtenerCartidadObjetos(); 
		int totalObjetosDespachados = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalObjetos", totalObjetos);
		model.addAttribute("totalObjetosDespachados", totalObjetosDespachados);
		model.addAttribute("parametrosBusqueda", new Contenedor());		
		model.addAttribute("listaContenedores", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaPatios", patioService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "contenedorBuscar";
	}
	
	@RequestMapping(value="/buscarContenedores.htm", method = RequestMethod.POST)
	public String listarBusqueda(ModelMap model, 
			@ModelAttribute("idContenedor") Integer idContenedor, 
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idPatio") Integer idPatio,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("idDocumento") Integer idDocumento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista,			
			BindingResult result, SessionStatus status){
		
		String query = "FROM Contenedor WHERE idContenedor is not Null ";			
		if(idContenedor != 0)
			query = query + "AND idContenedor = " + idContenedor.toString();
		else
			query = query + "AND idContenedor LIKE '%' ";
		
		if(idPaisProcedencia != 0)
			query = query + "AND idPaisProcedencia = " + idPaisProcedencia.toString();
		else
			query = query + "AND idPaisProcedencia LIKE '%' ";
		
		if(idPaisDestino != 0)
			query = query + "AND idPaisDestino = " + idPaisDestino.toString();
		else
			query = query + "AND idPaisDestino LIKE '%' ";
		
		if(idPatio != 0)
			query = query + "AND idPatio = " + idPatio.toString();
		else
			query = query + "AND idPatio LIKE '%' ";
			
		if(idTipoMovimiento != 0)
			query = query + "AND idTipoMovimiento = " + idTipoMovimiento.toString();
		else
			query = query + "AND idTipoMovimiento LIKE '%' ";
		
		if(idDocumento != 0)
			query = query + "AND idDocumento = " + idDocumento.toString();
		else
			query = query + "AND idDocumento LIKE '%' ";
		
		if(idCliente != 0)
			query = query + "AND idCliente = " + idCliente.toString();
		else
			query = query + "AND idCliente LIKE '%' ";
		
		if(idTransportista != 0)
			query = query + "AND idTransportista = " + idTransportista.toString();
		else
			query = query + "AND idTransportista LIKE '%' ";
		

		int totalObjetos = service.obtenerCartidadObjetos(); 
		int totalObjetosDespachados = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalObjetos", totalObjetos);
		model.addAttribute("totalObjetosDespachados", totalObjetosDespachados);
		model.addAttribute("parametrosBusqueda", new Contenedor());
		model.addAttribute("listaContenedores", service.obtenerObjetosByConsulta(query));		
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaPatios", patioService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "contenedorBuscar";
	}
	
	
	@RequestMapping(value="/editarContenedor.htm", method = RequestMethod.GET)
	public String editarObjeto(ModelMap model, @ModelAttribute("idContenedor") Integer idContenedor){
		
		model.addAttribute("contenedor", service.obtenerObjeto(idContenedor));	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaPatios", patioService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "contenedorEditar";
	}
	
	
	@RequestMapping(value="/guardarContenedorExistente.htm", method = RequestMethod.POST)
	public String guardarObjetoExistente(ModelMap model, 
			@ModelAttribute("idContenedor") Integer idContenedor, 
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idPatio") Integer idPatio,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("idDocumento") Integer idDocumento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista, 
			@ModelAttribute("peso") Double peso,
			BindingResult result, SessionStatus status){
		
		
		Contenedor contenedor = service.obtenerObjeto(idContenedor);
		contenedor.setPeso(peso);
		contenedor.setPaisProcedencia(paisService.obtenerObjeto(idPaisProcedencia));
		contenedor.setPaisDestino(paisService.obtenerObjeto(idPaisDestino));
		contenedor.setPatio(patioService.obtenerObjeto(idPatio));
		contenedor.setTipoMovimiento(tipoMovimientoService.obtenerObjeto(idTipoMovimiento));
		contenedor.setDocumento(documentoService.obtenerObjeto(idDocumento));
		contenedor.setCliente(clienteService.obtenerObjeto(idCliente));
		contenedor.setTransportista(transportistaService.obtenerObjeto(idTransportista));				
		service.actualizar(contenedor);
		
		int totalObjetos = service.obtenerCartidadObjetos(); 
		int totalObjetosDespachados = service.obtenerCartidadObjetosDespachadas();			
		
		model.addAttribute("totalObjetos", totalObjetos);
		model.addAttribute("totalObjetosDespachados", totalObjetosDespachados);
		model.addAttribute("parametrosBusqueda", new Contenedor());
		model.addAttribute("listaContenedores", null);	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaPatios", patioService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "contenedorBuscar";
	}
	
	@RequestMapping(value="/crearContenedor.htm", method = RequestMethod.GET)
	public String desplegarFormularioCrearObjeto(ModelMap model){	
		
		model.addAttribute("parametrosBusqueda", new Contenedor());		
		model.addAttribute("listaContenedores", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaPatios", patioService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "contenedorNuevo";
	}
	
	@RequestMapping(value="/guardarContenedorNuevo.htm", method = RequestMethod.POST)
	public String guardarObjetoNuevo(ModelMap model, 			
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idPatio") Integer idPatio,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("documento") File documento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista, 
			@ModelAttribute("peso") Double peso,
			BindingResult result, SessionStatus status){
		
		Documento nuevoDocumento = new Documento();
		nuevoDocumento.setIdMercancia(0);
		nuevoDocumento.setFechaIngreso(Calendar.getInstance().getTime());
		nuevoDocumento.setRutaArchivo(documento.getAbsolutePath());
		nuevoDocumento.setCliente(clienteService.obtenerObjeto(idCliente));
		nuevoDocumento = documentoService.agregar(nuevoDocumento);
		
		Contenedor contenedor = new Contenedor();
		contenedor.setFechaIngreso(Calendar.getInstance().getTime());
		contenedor.setPeso(peso);
		contenedor.setPaisProcedencia(paisService.obtenerObjeto(idPaisProcedencia));
		contenedor.setPaisDestino(paisService.obtenerObjeto(idPaisDestino));
		contenedor.setPatio(patioService.obtenerObjeto(idPatio));
		contenedor.setTipoMovimiento(tipoMovimientoService.obtenerObjeto(idTipoMovimiento));
		contenedor.setDocumento(nuevoDocumento);
		contenedor.setCliente(clienteService.obtenerObjeto(idCliente));
		contenedor.setTransportista(transportistaService.obtenerObjeto(idTransportista));				
		service.agregar(contenedor);
		
		int totalObjetos = service.obtenerCartidadObjetos(); 
		int totalObjetosDespachados = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalObjetos", totalObjetos);
		model.addAttribute("totalObjetosDespachados", totalObjetosDespachados);
		model.addAttribute("parametrosBusqueda", new Contenedor());
		model.addAttribute("listaContenedores", null);	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaPatios", patioService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "contenedorBuscar";
	}
	
	@RequestMapping(value="/eliminarContenedor.htm", method = RequestMethod.GET)
	public String eliminarObjeto(ModelMap model, @ModelAttribute("idContenedor") Integer idContenedor){	
		
		service.eliminar(idContenedor);
		
		int totalObjetos = service.obtenerCartidadObjetos(); 
		int totalObjetosDespachados = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalObjetos", totalObjetos);
		model.addAttribute("totalObjetosDespachados", totalObjetosDespachados);
		model.addAttribute("parametrosBusqueda", new Contenedor());		
		model.addAttribute("listaContenedores", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaPatios", patioService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "contenedorBuscar";
	}
 
	
	@RequestMapping(value="/despacharContenedor.htm", method = RequestMethod.GET)
	public String despacharObjeto(ModelMap model, 
			@ModelAttribute("idContenedor") Integer idContenedor){	
		
		Contenedor contenedor = service.obtenerObjeto(idContenedor);
		contenedor.setFechaSalida(Calendar.getInstance().getTime());	
		
		Factura factura = new Factura();
		factura.setSubtotal(contenedor.getPeso() * PRECIO_CONTENEDOR_PESO);
		factura.setImpuestos(factura.getSubtotal()*(TASA_IMPOSITIVA/100));
		factura.setTotal(factura.getSubtotal() + factura.getImpuestos());
		factura.setFecha(Calendar.getInstance().getTime());		
		factura.setCliente(contenedor.getCliente());
		factura.setCategoriaMercaderia(contenedor.getPatio().getCategoriaMercaderia());				
		
		service.actualizar(contenedor);
		factura  = facturaService.agregar(factura);
		
		ContenidoFactura contenidoFactura = new ContenidoFactura();
		contenidoFactura.setIdMercancia(contenedor.getPatio().getCategoriaMercaderia().getIdCategoria());
		contenidoFactura.setCosto(contenedor.getPeso() * PRECIO_CONTENEDOR_PESO);
		contenidoFactura.setFactura(factura);
		
		contenidoFacturaService.agregar(contenidoFactura);
		
		model.addAttribute("factura", factura);
		model.addAttribute("contenedor", contenedor);
		model.addAttribute("isCarga", false);
		
		return "facturaVer";
	}
	
	@RequestMapping(value="/verContenedor.htm", method = RequestMethod.GET)
	public String verObjeto(ModelMap model, @ModelAttribute("idContenedor") Integer idContenedor){
		
		model.addAttribute("contenedor", service.obtenerObjeto(idContenedor));	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaPatios", patioService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "contenedorVer";
	}
}
